所謂的 API,指的是「用工程師的方式,去說明某個功能的使用方法」,所以換句話說的話,API 就是用特定的格式,去表示某個功能到底要怎麼使用,等於是一個使用說明書的概念。
所以當前端拿到這份 API 文件時,前端就能夠照著上面的定義,去使用 GET 請求 /getProducts
這個 url 路徑,並且在請求時,帶上 size=5
這個請求參數(表示要取得 5 筆數據),這樣子就可以成功的去使用「取得商品列表」的功能,進而去取得 5 筆商品數據出來了!
所謂的「RESTful API」,就是表示去設計出一套「符合 REST 風格的 API」出來,所以換句話說的話,只要我們在設計 API 時,有去套用 REST 風格,那就可以稱呼我們所設計出來的這組 API,是 RESTful API 了!
如果想要設計出 RESTful API 的話,首先第一點,就是這個 API 必須要「使用 Http method,去表示要執行的資料庫操作」,也就是賦予了 Http method 更多的意義。
在 REST 風格中,REST 風格會把 POST、GET、PUT、DELETE 這四種 Http method,分別去對應到資料庫的 Create、Read、Update、Delete 操作上。
所以在 REST 風格中,只要看到某支 API 是使用 GET 來請求,那就是在暗示這個 API 會去資料庫中執行「Read(查詢數據)」的操作。或是如果該 API 是使用 POST 來請求,那就是在暗示這個 API 要去執行「Create(新增數據)」的操作。
因此在 RESTful API 的世界裡面,Http method 影響的不僅僅是 GET、POST 這些請求參數的傳遞而已,也是在「暗示」這支 API 後續會去執行資料庫中的哪種操作。
所以如果我們想要設計出一個 RESTful API 的話,那麼第一個必要條件,就是要「使用 Http method,去表示要執行的資料庫操作」。
成為 RESTful API 的第二個條件,就是「使用 url 路徑,描述資源之間的階層關係」。
在 REST 風格裡面,url 路徑代表的是「每個資源之間的階層關係」,這個聽起來可能有點抽象,所以我們可以直接透過一個例子,來了解什麼是資源之間的階層關係。
假設現在有一個使用 GET 來請求 API 為 GET /users
,首先因為這個 API 是使用 GET 來請求,因此根據上面的條件一的介紹,GET 就是對應到 Read(讀取數據)的操作,又因為後面的 url 路徑是 /users
,所以我們就可以知道他是要去「取得所有 user 的數據」。
此時假設我們又有另一個 API GET /users/123
,因為這個 API 也是使用 GET 來請求,所以也是去讀取數據,並且他的 url 路徑是 /users/123
,因此這個 API 的含義,就是「取得 user id 為 123 的那個 user 的數據」。
而到這邊,REST 風格的階層概念其實就出現了!
大家可以把 url 路徑中的每一個斜線 /
,想像成是一個個的階層,也就是一個子集合的感覺。或是說得更白話一點,就是可以直接把這個斜線 /
,替換成是中文的「的」。
GET /users
,就是表示去「取得所有 user 的數據」GET /users/123
,則是表示去取得所有 user 中「的」user id 為 123 的數據,所以就是「取得 user id 為 123 的那個 user 的數據」因此在 REST 風格裡面,我們就要透過 url 路徑,去表達「階層」的概念,並且透過 url 路徑,就可以去表達我們想要取得的資源是什麼了!
而至於成為 RESTful API 的最後一個條件,這個就比較簡單了,只要確保「Response body 所返回的數據,是使用 JSON 或是 XML 格式來返回」,這樣子就滿足 RESTful API 的第三個條件了!
而在 Spring Boot 中,如果要返回 JSON 格式的數據的話,就只要在 class 上面加上 @RestController
,並且將返回的類型改成「Java 物件」,這樣子就可以回傳 JSON 格式的數據給前端了。
所以總和上述的介紹,如果我們想要設計出一個 RESTful API 的話,那麼就需要符合以下三個條件:
只需要同時滿足這三個條件,那麼你的 API 就是一個「符合 REST 設計風格的 API」,所以也就可以稱呼他為 RESTful API 了!讚!!